﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/*****************13.深入理解指针3*****************/

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//int* p = &arr[0];
//	//int* p = arr;//数组名arr就是数组首元素(第一个元素)的地址
//	
//	//printf("%d",*p);
//	printf("%p\n", &arr[0]);
//	printf("%p\n", arr);
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("%zd\n",sizeof(arr));//40个字节
//	//数组名是数组首元素的地址，但有两个意外
//	/*1.sizeof(数组名) #sizeof的括号中单独放一个数组名时，数组名表示整个数组，
//	计算出的是整个数组数组的大小，单位是字节*/
//	
//	/*2.&数组名 #这里的数组名也表示整个数组，取出的是这个数组的地址。
//	*/
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	
//	printf("&arr[0]   = %p\n", &arr[0]); //首元素地址
//	printf("&arr[0]+1 = %p\n", &arr[0]+1); //跳一个数组元素大小
//	
//	printf("arr       = %p\n", arr);	 //首元素地址
//	printf("arr+1     = %p\n", arr+1);	 //跳一个数组元素大小
//	
//	printf("&arr      = %p\n", &arr);	 //数组的地址
//	printf("&arr+1    = %p\n", &arr+1);  //跳一整个数组，数组指针
//
//	return 0;
//}

/***************2.使⽤指针访问数组******************/
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//
//	//打印数组的内容，使用指针
//	int* p = arr;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	for (i = 0;i < sz ; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//
//	//打印数组的内容，使用指针
//	int* p = arr;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *p);
//		p++; 
//	}
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//
//	//打印数组的内容，使用指针
//	int* p = arr;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	//输入数组的内容
//	for (i = 0; i < sz ; i++ )
//	{
//		scanf("%d",p);
//		p++;
//	}
//	p = arr;
//
//	//输出数组的内容
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *p);
//		p++;
//	}
//
//	return 0;
//}

//2+3 --> 3+2
//arr[i] --> *(arr + i)
//i[arr] --> *(i + arr)
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//
//	//打印数组的内容，使用指针
//	int* p = arr;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//
//	//输出数组的内容
//	//arr[i] --> *(arr + i)底层就是这样的，变成指针
//	//
//	//源自于[]就是一个操作符而已
//	//  
//	for (i = 0; i < sz; i++)
//	{
//		//printf("%d ", p[i]);
//		//printf("%d ", *(i + p));
//		//printf("%d ", i[p]);
//		printf("%d ", i[arr]);
//
//	}
//
//	return 0;
//}

/***************3.⼀维数组传参的本质******************/
//void print_arr(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
// 
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//写一个函数，打印数组内容
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	print_arr(arr,sz);
//	return 0;
//}

//int *
//void print_arr(int arr[], int sz)
//{
//	int i = 0;
//	
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//}
//
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//写一个函数，打印数组内容
//	//数组传参不会把整个数组传递过去
//	print_arr(arr, sz);//arr数组名标识就是数组首元素的地址，所以这里把数组首元素地址传过去了
//	return 0;
//}

//数组传参的时候，传递的是数组首元素的地址
//1.函数的形参可以写成数组，也可以写成指针
//2.所以在函数内没办法计算数组的元素个数
//3.所以形参的数组和实参的数组是同一个数组

/***************4.冒泡排序******************/
//void bubble_sort(int arr[], int sz)
//{
//	int i = 0;
//	//趟数
//	for (i = 0; i < sz-1; i++)
//	{
//		int flag = 0; //假设已经有序了
//		//处理一趟的过程-处理多少对数据
//		for (int j = 0; j < sz - 1 - i; j++)
//		{
//			if (arr[j] > arr[j + 1])
//			{
//				flag = 1;
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//
//			}
//		}
//		if (flag == 0)
//		{
//			break;
//		}
//	}
//}
//
//void print_arr(int arr[], int sz)
//{
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//}
//
//int main()
//{
//	//int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	//排序 - 排成升序
//	//冒号排序
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	print_arr(arr,sz);
//	return 0;
//}

/***************5.二级指针******************/
//二级指针变量是用来存放一级指针变量的地址
//int main()
//{
//	int a = 10;
//	int* p = &a;//一级指针变量
//	int** pp = &p; //pp就是二级指针
//
//	printf("%d ",**pp); //*(*pp) 
//	return 0;
//}

/***************6.指针数组******************/
//字符数组 char[5]; --存放字符的数组
//整形数组 int arr[6]; --存放整形的数组
//指针数组 --存放指针(地址)的数组

//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = 30;
//
//	int* arr[3] = { &a,&b,&c };//arr是存放指针的数组 - 指针数组
//	int i = 0;
//	for ( i = 0; i < 3; i++)
//	{
//		printf("%d ", *arr[i]);
//	}
//	return 0;
//}

/***************7.指针数组模拟二维数组******************/
//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 2,3,4,5,6 };
//	int arr3[] = { 3,4,5,6,7 };
//
//	//              int* int* int*
//	int* arr[3] = { arr1,arr2,arr3 };
//	//arr就是指针数组
//
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (int j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//		
//	}
//
//	return 0;
//}









